package cn.kinoko.common.base.exception;

import cn.kinoko.common.base.model.Result;
import jakarta.validation.ConstraintViolationException;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.yaml.snakeyaml.constructor.DuplicateKeyException;

import java.net.BindException;

/**
 * 异常基类接口
 * @author kk
 */
public interface ExceptionAdvice {

    /**
     * JSON参数校验异常
     * @param e 异常
     * @return 错误信息
     */
    Result<Object> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e);

    /**
     * form表单参数校验异常
     * @param e 异常
     * @return 错误信息
     */
    Result<Object> methodArgumentNotValidExceptionHandler(BindException e);

    /**
     * 单参数校验异常
     * @param e 异常
     * @return 错误信息
     */
    Result<Object> methodArgumentNotValidExceptionHandler(ConstraintViolationException e);

    /**
     * 非法参数异常
     * @param e 异常
     * @return 错误信息
     */
    Result<Object> illegalArgumentExceptionHandler(IllegalArgumentException e);

    /**
     * 参数缺失异常
     * @param e 异常
     * @return 错误信息
     */
    Result<Object> httpMessageNotReadableExceptionHandler(HttpMessageNotReadableException e);

    /**
     * 重复键异常
     * @param e 异常
     * @return 错误信息
     */
    Result<Object> duplicateKeyExceptionHandler(DuplicateKeyException e);

    /**
     * 未找到处理器异常
     * @param e 异常
     * @return 错误信息
     */
    Result<Object> httpRequestMethodNotSupportedExceptionHandler(HttpRequestMethodNotSupportedException e);

    /**
     * 未知异常
     * @param e 未知异常
     * @return 错误信息
     */
    Result<Object> exceptionHandler(Exception e);


}
